#include <iostream>

class Base
{
public:
    virtual void show()     //虚函数
    {
        std::cout<<"Base\n";
    }

};

class Derived1 : public Base
{
public:
    void show()
    {
        std::cout << "Derived1\n";
    }
};

class Derived2 : public Base
{
public:
    void show() //子类函数和父类函数完全相同的叫做重写
    {
        std::cout << "Derived2\n";
    }
};

int main()
{
    // 多态：同一句代码，不同的功能
    Derived1 *d1 = new Derived1;
    Derived2 *d2 = new Derived2;

    // d1->show();
    // d2->show();


    //C++允许将子类指针转成基类指针:  向上转型
    Base *b1 = d1;
    Base *b2 = d2;
    
    //Derived1 *t = b1;//向下转型：基类指针转成子类指针:不被允许

    Base *b = d1;
    b->show();

    b = d2;
    b->show();

    //C++多态：
    //1、基类指针指向子类对象
    //2、基类定义虚函数
    //3、子类重写父类虚函数

    //重写 和 名词遮蔽

    //虚函数为什么能实现多态?
    //虚函数表 和 虚函数指针

    return 0;
}